<!doctype html>
<html>

<head>
    <title>Socket.IO chat</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            font: 13px Helvetica, Arial;
        }

        form {
            background: #000;
            padding: 3px;
            position: fixed;
            bottom: 0;
            width: 100%;
        }

        form input {
            border: 0;
            padding: 10px;
            width: 90%;
            margin-right: .5%;
        }

        form button {
            width: 9%;
            background: rgb(130, 224, 255);
            border: none;
            padding: 10px;
        }

        #messages {
            list-style-type: none;
            margin: 0;
            padding: 0;
        }

        #messages li {
            padding: 5px 10px;
        }

        #messages li:nth-child(odd) {
            background: #eee;
        }
    </style>
</head>

<body>
    <ul id="messages"></ul>
    <form action="">
        <input id="m" autocomplete="off" /><button>Send</button>
    </form>
</body>
<script src="https://cdn.bootcss.com/socket.io/2.2.0/socket.io.js"></script>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script>
    $(function () {
        var socket = io();
        $('form').submit(function (e) {
            e.preventDefault(); // prevents page reloading
            socket.emit('chat message', $('#m').val());
            $('#m').val('');
            return false;
        });

        socket.on('connect', function () {
            console.log(`connected, socket: ${socket.id}`);
        });

        socket.on('message', function(data, callback) {
            console.log(JSON.stringify(data));
            callback && callback('i got msg.')
        });

        socket.on('disconnect', function () {
            console.log("socket event: disconnect");
            socket.connect();
        });

        socket.on('reconnect_attempt', (attemptNumber) => {
            console.log("socket event: reconnect_attempt");
        });

        socket.on('reconnecting', (attemptNumber) => {
            console.log("socket event: reconnecting");
        });

        socket.on('reconnect_error', (error) => {
            console.log("socket event: reconnect_error");
        });

        socket.on('reconnect_failed', () => {
            console.log("socket event: reconnect_failed");
        });

        socket.on('connect_error', (error) => {
            console.log("socket event: connect_error");
        });

        socket.on('connect_timeout', (timeout) => {
            console.log("socket event: connect_timeout");
        });

        socket.on('error', (error) => {
            console.log("socket event: error");
        });

        socket.on('ping', () => {
            console.log("socket event: ping");
        });

        socket.on('pong', (latency) => {
            console.log("socket event: pong");
        });
    });
</script>

</html>